﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Interfaces;
using Implementation;

/**
 * 
 * \file JoueurCivil.xaml.cs
 * \brief Joueur Civil
 * \author Baptiste Villiot - Jonathan Langlais
 * \version 1.0
 * 
 */
namespace CivilisationWPF
{
    /**
   * 
   * \class JoueurCivil
   * \brief Affiche les champs a completer pour les joueurs
   * 
    */
    public partial class JoueurCivil : Grid
    {
        /**
         * !< le monteur de partie
         */
        private MonteurPartie monteur;


        /**
         * !< la strategie de jeu
         */
        private MonteurPartieImpl.strategie strategie;

        /**
         * !< la fenetre ou est affichee le jeu
         */
        private MainWindow main;

        /**
         * \fn JoueurCivil(MonteurPartie mont, MonteurPartieImpl.strategie str,MainWindow main)
         * \brief Constructeur de JoueurCivil
         * \param[in] mont le monteur
         * \param[in] str la strategie
         * \param[in] main la fenetre
         */
        public JoueurCivil(MonteurPartie mont, MonteurPartieImpl.strategie str, MainWindow main)
        {
            InitializeComponent();
            this.main = main;
            monteur = mont;
            strategie = str;
            StackPanel stackVerticale = new StackPanel();
            stackVerticale.Name = "stackVert";

            int k = 0;
            
            switch (strategie)
            {
                case MonteurPartieImpl.strategie.petiteCarte:
                    k = 2;
                    break;
                case MonteurPartieImpl.strategie.grandeCarte:
                    k = 4;
                    break;
            }
            for (int i = 0; i < k; i++)
            {
                StackPanel stack1 = new StackPanel();
                stack1.Orientation = Orientation.Horizontal;
                stack1.Name = "stack" + i;
                Label lab = new Label();
                lab.Content = "Joueur " + (i + 1);
                stack1.Children.Add(lab);
                TextBox text = new TextBox();
                text.Width = 150;
                text.Name = "joueur" + i;
                stack1.Children.Add(text);
                ComboBox list = new ComboBox();
                list.Width = 150;
                list.Name = "combo" + i;
                list.Text = "Choix civilisation";
                list.IsEditable = true;
                list.IsReadOnly = true;
                ComboBoxItem item = new ComboBoxItem();
                item.Content = "Civilisation EII";
                item.Name = "civilEII" + i;
                list.Items.Add(item);
                item = new ComboBoxItem();
                item.Content = "Civilisation INFO";
                item.Name = "civilINFO" + i;
                list.Items.Add(item);

                ComboBox listcouleur = new ComboBox();
                listcouleur.Width = 100;
                listcouleur.Name = "couleur" + i;
                listcouleur.Text = "Choix couleur";
                listcouleur.IsEditable = true;
                listcouleur.IsReadOnly = true;
                ComboBoxItem itemcolor = new ComboBoxItem();
                itemcolor.Content = "Rouge";
                itemcolor.Name = "rouge" + i;
                listcouleur.Items.Add(itemcolor);
                itemcolor = new ComboBoxItem();
                itemcolor.Content = "Bleu";
                itemcolor.Name = "bleu" + i;
                listcouleur.Items.Add(itemcolor);
                itemcolor = new ComboBoxItem();
                itemcolor.Content = "Vert";
                itemcolor.Name = "vert" + i;
                listcouleur.Items.Add(itemcolor);
                itemcolor = new ComboBoxItem();
                itemcolor.Content = "Jaune";
                itemcolor.Name = "jaune" + i;
                listcouleur.Items.Add(itemcolor);

                stack1.Children.Add(list);
                stack1.Children.Add(listcouleur);

                stackVerticale.Children.Add(stack1);
            }

            Button bouton = new Button();
            bouton.Width = 150;
            bouton.Content = "Commencer la partie";
            bouton.Click += clickValider;

            stackVerticale.Children.Add(bouton);

            this.Children.Add(stackVerticale);
        }

        /**
         * \fn clickValider(object sender, RoutedEventArgs e)
         * \brief construit la carte choisie
         * \param[in] sender l'objet qui fait appel a la methode
         * \param[in] e l'evenement lance
         */
        public void clickValider(object sender, RoutedEventArgs e)
        {
            CarteXaml carte = null;
            StackPanel stackVert = null;
            bool ok = true;

            foreach (object item in this.Children)
            {
                if (item is StackPanel)
                {
                   
                    stackVert = (StackPanel)item;
                    break;
                }
            }
            int p1 = 0;
            int p2 = 0;
            int k = 0;
            int taille = 0;
            switch (strategie)
            {
                case MonteurPartieImpl.strategie.petiteCarte :
                    k = 2;
                    taille = 25;
                    break;
                case MonteurPartieImpl.strategie.grandeCarte :
                    k=4;
                    taille = 100;
                    break;
            }
            for (int i = 0; i < k; i++)
            {
                int civil = 0;
                int color = 0;
                StackPanel stackJoueur = null;

                foreach (object item in stackVert.Children)
                {
                    if (item is StackPanel)
                    {
                        stackJoueur = (StackPanel)item;
                        if (stackJoueur.Name.CompareTo("stack" + i) == 0)
                        {
                            break;
                        }
                    }
                }
                ComboBox combo = null;

                foreach (object item in stackJoueur.Children)
                {
                    if (item is ComboBox)
                    {
                        combo = (ComboBox)item;
                        if (combo.Name.CompareTo("combo" + i) == 0)
                        {
                            break;
                        }
                    }
                }
                ComboBox couleur = null;

                foreach (object item in stackJoueur.Children)
                {
                    if (item is ComboBox)
                    {
                        couleur = (ComboBox)item;
                        if (couleur.Name.CompareTo("couleur" + i) == 0)
                        {
                            break;
                        }
                    }
                }

                ComboBoxItem comboItem = null;

                foreach (object item in combo.Items)
                {
                    if (item is ComboBoxItem)
                    {
                        comboItem = (ComboBoxItem)item;
                        if (comboItem.Name.CompareTo("civilINFO" + i) == 0)
                        {
                            if (comboItem.IsSelected)
                            {
                                civil = 1;
                                break;
                            }
                        }
                        else if (comboItem.Name.CompareTo("civilEII" + i) == 0)
                        {
                            if (comboItem.IsSelected)
                            {
                                civil = 2;
                                break;
                            }
                        }
                    }
                }

                ComboBoxItem couleurItem = null;

                if(couleur.SelectedIndex == -1)
                {
                    ok = false;
                    MessageBox.Show("Vous devez choisir une couleur Joueur " + (i+1));
                    break;
                }

                foreach (object item in couleur.Items)
                {
                    if (item is ComboBoxItem)
                    {
                        couleurItem = (ComboBoxItem)item;
                        if (couleurItem.Name.CompareTo("rouge" + i) == 0)
                        {
                            if (couleurItem.IsSelected)
                            {
                                color = 1;
                                break;
                            }
                        }
                        else if (couleurItem.Name.CompareTo("bleu" + i) == 0)
                        {
                            if (couleurItem.IsSelected)
                            {
                                color = 2;
                                break;
                            }
                        }
                        else if (couleurItem.Name.CompareTo("vert" + i) == 0)
                        {
                            if (couleurItem.IsSelected)
                            {
                                color = 3;
                                break;
                            }
                        }
                        else if (couleurItem.Name.CompareTo("jaune" + i) == 0)
                        {
                            if (couleurItem.IsSelected)
                            {
                                color = 4;
                                break;
                            }
                        }
                    }
                }

                TextBox text = null;

                foreach (object item in stackJoueur.Children)
                {
                    if (item is TextBox)
                    {
                        text = (TextBox)item;
                        if (text.Name.CompareTo("joueur" + i) == 0)
                        {
                            break;
                        }
                    }
                }
                if (civil != 0)
                {

                    Joueur j = new JoueurImpl(text.Text, civil, color);

                    Random rand = new Random();
                    switch (i)
                    {
                        case 0:
                            p1 = rand.Next(taille / 5);
                            p2 = rand.Next(taille / 5);
                            break;
                        case 1:
                            p1 = (taille/2) + rand.Next(taille / 5);
                            p2 = (taille/2) + rand.Next(taille / 5);
                            break;
                        case 2:
                            p1 = (taille / 2) + rand.Next(taille / 5);
                            p2 = rand.Next(taille / 5);
                            break;
                        case 3:
                            p1 = rand.Next(taille / 5);
                            p2 = (taille / 2) + rand.Next(taille / 5);
                            break;
                    }
                    Enseignant ens = j.creerEns(new Tuple<int, int>(p1, p2));
                    j.Unite.Add(ens);
                    Etudiant etu = j.creerEtu(new Tuple<int, int>(p1, p2));
                    j.Unite.Add(etu);
                    MonteurPartieImpl.joueur.Add(j);
                }
                if (civil == 0 && i <= 1)
                {
                    ok = false;
                    MessageBox.Show("Vous devez être au moins deux joueurs");
                    break;
                }
            }
            if (ok)
            {
                MonteurPartieImpl.joueurCourant = MonteurPartieImpl.joueur.First();
                if (k == 4)
                {
                    carte = new CarteXaml(monteur, MonteurPartieImpl.strategie.grandeCarte,main);
                }
                else
                {
                    carte = new CarteXaml(monteur, MonteurPartieImpl.strategie.petiteCarte,main);
                }
                main.content.Content = carte;
            }
        }
    }
}
